{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# step 1. 直接调用xgboost内嵌的cv寻找最佳的参数n_estimators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取libsvm格式数据\n",
    "dpath = './data/'\n",
    "dtrain = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "dtrain.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nRqWwREREo/4/M/NxIS1P9IIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1f78db96cc0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.countplot(dtrain.interest_level);\n",
    "pyplot.xlabel('interest_level');\n",
    "pyplot.ylabel('Number of interest_level');\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 49352 entries, 0 to 49351\n",
      "Columns: 228 entries, bathrooms to interest_level\n",
      "dtypes: float64(9), int64(219)\n",
      "memory usage: 85.8 MB\n"
     ]
    }
   ],
   "source": [
    "dtrain.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dtrain.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train = dtrain['interest_level']\n",
    "train = dtrain.drop([\"interest_level\"], axis=1)\n",
    "X_train = np.array(train)\n",
    "\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def modelfit(alg, X_train, y_train, useTrainCV=True, cv_folds=None, early_stopping_rounds=100):\n",
    "    \n",
    "    if useTrainCV:\n",
    "        xgb_param = alg.get_xgb_params()\n",
    "        xgb_param['num_class'] = 3\n",
    "        \n",
    "        xgtrain = xgb.DMatrix(X_train, label = y_train)\n",
    "        \n",
    "        cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds =cv_folds,\n",
    "                         metrics='mlogloss', early_stopping_rounds=early_stopping_rounds)\n",
    "        \n",
    "        n_estimators = cvresult.shape[0]\n",
    "        alg.set_params(n_estimators = n_estimators)\n",
    "        \n",
    "        print(cvresult)\n",
    "        #result = pd.DataFrame(cvresult)   #cv缺省返回结果为DataFrame\n",
    "        #result.to_csv('my_preds.csv', index_label = 'n_estimators')\n",
    "        cvresult.to_csv('1_nestimators.csv', index_label = 'n_estimators')\n",
    "        \n",
    "        # plot\n",
    "        test_means = cvresult['test-mlogloss-mean']\n",
    "        test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "        train_means = cvresult['train-mlogloss-mean']\n",
    "        train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "        x_axis = range(0, n_estimators)\n",
    "        pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "        pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "        pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "        pyplot.xlabel( 'n_estimators' )\n",
    "        pyplot.ylabel( 'Log Loss' )\n",
    "        pyplot.savefig( '1_n_estimators.png' )\n",
    "    \n",
    "    #Fit the algorithm on the data\n",
    "    alg.fit(X_train, y_train, eval_metric='mlogloss')\n",
    "        \n",
    "    #Predict training set:\n",
    "    train_predprob = alg.predict_proba(X_train)\n",
    "    logloss = log_loss(y_train, train_predprob)\n",
    "\n",
    "        \n",
    "    #Print model report:\n",
    "    print(\"logloss of train :\" )\n",
    "    print(logloss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#调整max_depth和min_child_weight之后再次调整n_estimators(6,4)\n",
    "xgb2_3 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=699,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=6,\n",
    "        min_child_weight=4,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective='multi:softprob',\n",
    "        seed=3,\n",
    "        nthread=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     test-mlogloss-mean  test-mlogloss-std  train-mlogloss-mean  \\\n",
      "0              1.039030           0.000457             1.038030   \n",
      "1              0.989291           0.000522             0.987352   \n",
      "2              0.945882           0.000679             0.943149   \n",
      "3              0.908519           0.000498             0.905028   \n",
      "4              0.876974           0.000704             0.872467   \n",
      "5              0.848852           0.001035             0.843520   \n",
      "6              0.824486           0.001511             0.818404   \n",
      "7              0.803252           0.001756             0.796272   \n",
      "8              0.784635           0.001761             0.776728   \n",
      "9              0.768205           0.001874             0.759580   \n",
      "10             0.753316           0.001766             0.743932   \n",
      "11             0.740046           0.001871             0.729882   \n",
      "12             0.728552           0.001696             0.717535   \n",
      "13             0.718186           0.001678             0.706280   \n",
      "14             0.708868           0.001783             0.696136   \n",
      "15             0.700586           0.001844             0.687078   \n",
      "16             0.693084           0.001879             0.678890   \n",
      "17             0.686348           0.001932             0.671406   \n",
      "18             0.680539           0.002060             0.664755   \n",
      "19             0.675231           0.002122             0.658705   \n",
      "20             0.670295           0.002316             0.653130   \n",
      "21             0.665945           0.002317             0.647985   \n",
      "22             0.661974           0.002435             0.643280   \n",
      "23             0.658557           0.002222             0.639072   \n",
      "24             0.655036           0.002010             0.635039   \n",
      "25             0.651777           0.002152             0.630897   \n",
      "26             0.648900           0.002260             0.627418   \n",
      "27             0.646314           0.002286             0.624205   \n",
      "28             0.643836           0.002429             0.621055   \n",
      "29             0.641491           0.002466             0.618021   \n",
      "..                  ...                ...                  ...   \n",
      "187            0.591755           0.002296             0.485359   \n",
      "188            0.591783           0.002358             0.484935   \n",
      "189            0.591755           0.002367             0.484454   \n",
      "190            0.591757           0.002347             0.484025   \n",
      "191            0.591759           0.002423             0.483559   \n",
      "192            0.591722           0.002432             0.483032   \n",
      "193            0.591618           0.002422             0.482523   \n",
      "194            0.591584           0.002425             0.482147   \n",
      "195            0.591552           0.002458             0.481621   \n",
      "196            0.591569           0.002487             0.481120   \n",
      "197            0.591498           0.002410             0.480580   \n",
      "198            0.591444           0.002396             0.480158   \n",
      "199            0.591489           0.002419             0.479781   \n",
      "200            0.591558           0.002390             0.479418   \n",
      "201            0.591526           0.002391             0.478880   \n",
      "202            0.591562           0.002379             0.478424   \n",
      "203            0.591560           0.002356             0.477880   \n",
      "204            0.591494           0.002310             0.477376   \n",
      "205            0.591426           0.002316             0.476935   \n",
      "206            0.591451           0.002333             0.476591   \n",
      "207            0.591466           0.002334             0.476134   \n",
      "208            0.591498           0.002432             0.475701   \n",
      "209            0.591490           0.002373             0.475210   \n",
      "210            0.591539           0.002461             0.474799   \n",
      "211            0.591525           0.002406             0.474327   \n",
      "212            0.591468           0.002450             0.473929   \n",
      "213            0.591462           0.002465             0.473396   \n",
      "214            0.591389           0.002452             0.473024   \n",
      "215            0.591357           0.002424             0.472520   \n",
      "216            0.591306           0.002544             0.472015   \n",
      "\n",
      "     train-mlogloss-std  \n",
      "0              0.000596  \n",
      "1              0.000614  \n",
      "2              0.000703  \n",
      "3              0.000520  \n",
      "4              0.000447  \n",
      "5              0.000276  \n",
      "6              0.000225  \n",
      "7              0.000110  \n",
      "8              0.000264  \n",
      "9              0.000142  \n",
      "10             0.000435  \n",
      "11             0.000244  \n",
      "12             0.000527  \n",
      "13             0.000676  \n",
      "14             0.000613  \n",
      "15             0.000645  \n",
      "16             0.000698  \n",
      "17             0.000795  \n",
      "18             0.000837  \n",
      "19             0.000835  \n",
      "20             0.000650  \n",
      "21             0.000808  \n",
      "22             0.000768  \n",
      "23             0.001066  \n",
      "24             0.001199  \n",
      "25             0.001157  \n",
      "26             0.001226  \n",
      "27             0.001204  \n",
      "28             0.001160  \n",
      "29             0.001133  \n",
      "..                  ...  \n",
      "187            0.001483  \n",
      "188            0.001425  \n",
      "189            0.001472  \n",
      "190            0.001403  \n",
      "191            0.001421  \n",
      "192            0.001398  \n",
      "193            0.001521  \n",
      "194            0.001478  \n",
      "195            0.001554  \n",
      "196            0.001614  \n",
      "197            0.001679  \n",
      "198            0.001695  \n",
      "199            0.001660  \n",
      "200            0.001642  \n",
      "201            0.001551  \n",
      "202            0.001545  \n",
      "203            0.001548  \n",
      "204            0.001546  \n",
      "205            0.001338  \n",
      "206            0.001223  \n",
      "207            0.001191  \n",
      "208            0.001132  \n",
      "209            0.001114  \n",
      "210            0.001105  \n",
      "211            0.001065  \n",
      "212            0.001083  \n",
      "213            0.001137  \n",
      "214            0.001156  \n",
      "215            0.001130  \n",
      "216            0.001119  \n",
      "\n",
      "[217 rows x 4 columns]\n",
      "logloss of train :\n",
      "0.49610405824707815\n"
     ]
    }
   ],
   "source": [
    "modelfit(xgb2_3, X_train, y_train, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1f78dbb5128>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "        \n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "\n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.legend()\n",
    "pyplot.savefig( '1_n_estimators.png' )\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
